package com.lanyou.esb.redis.proxy;

import java.io.IOException;
import java.util.List;

import redis.clients.jedis.Jedis;

import com.fasterxml.jackson.core.JsonParseException;
import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.JsonMappingException;

/**
 * 针对List数据类型的Redis代理接口
 * 
 * @author Davey.wu
 */
public interface ListJedisProxy<T> extends JedisProxy<T> {
	/**
	 * 获取存储LIST类型数据的KEY
	 * 
	 * @return
	 */
	String getListKey();

	/**
	 * 将集合元素插入链表右侧
	 * 
	 * @param list
	 *            :要保存的集合
	 * @throws JsonProcessingException
	 */
	void rpush(List<T> list) throws JsonProcessingException;

	/**
	 * 将元素插入链表左侧
	 * 
	 * @param key
	 *            :键值
	 * @param target
	 *            ：目标对象
	 * @throws JsonProcessingException
	 */
	void lpush(String key, T target)
			throws JsonProcessingException;
	
	/**
	 * 将元素插入链表左侧
	 * 
	 * @param key
	 *            :键值
	 * @param target
	 *            ：目标对象
	 * @throws JsonProcessingException
	 */
	void lpush(Jedis jedis, String key, T target)
			throws JsonProcessingException;

	/**
	 * 将元素插入链表右侧
	 * 
	 * @param key
	 *            :键值
	 * @param target
	 *            ：目标对象
	 * @throws JsonProcessingException
	 */
	void rpush(String key, T target)
			throws JsonProcessingException;

	/**
	 * 从链表左侧取出一个元素
	 * 
	 * @param key
	 *            :键值
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	T lpop(String key) throws JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表左侧取出一个元素
	 * 
	 * @param jedis
	 *            ：jedis客户端对象
	 * @param key
	 *            :键值
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	T lpop(Jedis jedis, String key)
			throws JsonParseException, JsonMappingException, IOException;

	/**
	 * 从链表右侧取出一个元素
	 * 
	 * @param key
	 *            :键值
	 * @return
	 * @throws JsonParseException
	 * @throws JsonMappingException
	 * @throws IOException
	 */
	T rpop(String key) throws JsonParseException,
			JsonMappingException, IOException;

	/**
	 * 从链表右侧取出一个元素
	 * 
	 * @param jedis
	 *            ：jedis客户端
	 * @param key
	 *            ：键值
	 * @return
	 * @throws IOException
	 * @throws JsonMappingException
	 * @throws JsonParseException
	 */
	T rpop(Jedis jedis, String key)
			throws JsonParseException, JsonMappingException, IOException;

}
